// Copyright (C) Kumo inc. and its affiliates.
// Author: Jeff.li lijippy@163.com
// All rights reserved.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
//

#pragma once

#include <kmsql/sql/grammar/statement.h>

namespace kmsql {
    // Represents the result of the SQLParser.
    // If parsing was successful it contains a list of SQLStatement.
    class SQLParserResult {
    public:
        // Initialize with empty statement list.
        SQLParserResult();

        // Initialize with a single statement.
        // Takes ownership of the statement.
        SQLParserResult(SQLStatement *stmt);

        // Move constructor.
        SQLParserResult(SQLParserResult &&moved);

        SQLParserResult &operator=(SQLParserResult &&moved);

        // Deletes all statements in the result.
        virtual ~SQLParserResult();

        // Set whether parsing was successful.
        void setIsValid(bool isValid);

        // Returns true if parsing was successful.
        bool isValid() const;

        // Returns the number of statements in the result.
        size_t size() const;

        // Set the details of the error, if available.
        // Takes ownership of errorMsg.
        void setErrorDetails(char *errorMsg, int errorLine, int errorColumn);

        // Returns the error message, if an error occurred.
        const char *errorMsg() const;

        // Returns the line number of the occurrance of the error in the query.
        int errorLine() const;

        // Returns the column number of the occurrance of the error in the query.
        int errorColumn() const;

        // Adds a statement to the result list of statements.
        // SQLParserResult takes ownership of the statement.
        void addStatement(SQLStatement *stmt);

        // Gets the SQL statement with the given index.
        const SQLStatement *getStatement(size_t index) const;

        // Gets the non const SQL statement with the given index.
        SQLStatement *getMutableStatement(size_t index);

        // Get the list of all statements.
        const std::vector<SQLStatement *> &getStatements() const;

        // Returns a copy of the list of all statements in this result.
        // Removes them from this result.
        std::vector<SQLStatement *> releaseStatements();

        // Deletes all statements and other data within the result.
        void reset();

        // Does NOT take ownership.
        void addParameter(Expr *parameter);

        const std::vector<Expr *> &parameters();

    private:
        // List of statements within the result.
        std::vector<SQLStatement *> statements_;

        // Flag indicating the parsing was successful.
        bool isValid_;

        // Error message, if an error occurred.
        char *errorMsg_;

        // Line number of the occurrance of the error in the query.
        int errorLine_;

        // Column number of the occurrance of the error in the query.
        int errorColumn_;

        // Does NOT have ownership.
        std::vector<Expr *> parameters_;
    };
} // namespace kmsql

